package SynchronizedDemo.Synchronized02;

/**
 * @Author: ylc
 * @Description:解决线程安全问题的第2种方案:使用同步方法
 * @Date Created in 2022-04-20 16:57
 */
public class RunnableImpl implements Runnable{
    /*
        格式:定义方法的格式
            修饰符 synchronized 返回值类型 方法名(参数列表){
                可能会出现线程安全问题的代码(访问了共享数据的代码)
            }
     */
    //定义一个多个线程共享的票源
    private  int ticket = 100;
    //创建一个锁对象
    Object obj = new Object();

    //设置线程任务:卖票
    @Override
    public void run() {
        //使用死循环,让卖票操作重复执行
        while(true){
            payTicket();
        }
    }
    /*
       定义一个同步方法
       同步方法也会把方法内部的代码锁住
       只让一个线程执行
       同步方法的锁对象是谁?
       就是实现类对象 new RunnableImpl()
       也是就是this
    */
    public synchronized void payTicket() {
        /*synchronized (this) {*/
        //先判断票是否存在
        if(ticket>0){
            //提高安全问题出现的概率,让程序睡眠
            try {
                Thread.sleep(10);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }

            //票存在,卖票 ticket--
            System.out.println(Thread.currentThread().getName()+"-->正在卖第"+ticket+"张票");
            ticket--;
        }
    }
}
